home *** CD-ROM | disk | FTP | other *** search
/ PC-SIG: World of Utilities / PC-SIG's World of Utilities (PC-SIG) (1994).iso / UTI / DISK1668.ZIP / SAYTIME.ASM < prev    next >
Assembly Source File  |  1986-03-22  |  6KB  |  290 lines

  1. ; --------------------
  2. ; Speak de time by CJD
  3. ; --------------------
  4.  
  5. ;    imbed c:\masm\saldef.sal
  6. ; ----- SAT definitions
  7.  
  8. ;        saljmp short
  9. ;        salcmp unsigned
  10.  
  11. ;        salmac := mov &-,&+
  12. ;        salmac ==> lea &-,&+
  13. ;        salmac =& mov &-,offset &+
  14. ;        salmac -> mov &-,offset &+
  15.  
  16. ;        salmac -- dec &+
  17. ;        salmac ++ inc &+
  18.  
  19. ;        salmac += add &-,&+
  20. ;        salmac -= sub &-,&+
  21. ;        salmac /= div &+
  22. ;        salmac *= mul &+
  23.  
  24. ;        salmac |= or &-,&+
  25. ;        salmac &= and &-,&+
  26. ;        salmac ^= xor &-,&+
  27.  
  28. ;        salmac >= shr &-,&+
  29. ;        salmac >> shr &-,&+
  30. ;        salmac <= shl &-,&+
  31. ;        salmac << shl &-,&+
  32.  
  33. ;        salmac clear xor &+,&+
  34.  
  35. ;        salmac <- push &+ ^ pop &-
  36. ;        saldef jmps jmp short
  37. ;        saldef (b) byte ptr
  38. ;        saldef (w) word ptr
  39. ;        saldef (si) byte ptr [si]
  40. ;        saldef (di) byte ptr [di]
  41. ;        saldef {si} word ptr [si]
  42. ;        saldef {di} word ptr [di]
  43.  
  44.     include c:\masm\stdlib.mac
  45.  
  46. ; ----- Define locations of interest in the vector table
  47. Abs0    segment at 0
  48.  
  49.     org 0F1H*4+2            ; Speech segment address
  50. SpPtr    label word
  51.  
  52.     org 0F3H*4            ; Code to call Speech (INT F2)
  53. Speech    label far
  54.  
  55. Abs0    ends
  56.  
  57. ; ----- Define a dummy Speech code segment for code verification
  58. SpeechSeg  segment at 0          ; Don't really know where, but...
  59.     org 100H
  60. SpeechCode label byte
  61. SpeechSeg  ends
  62.  
  63.  
  64. ; ----- Finally our real code segment
  65. code    segment
  66. assume    cs:code,ds:code,es:code
  67.  
  68.     org 100H            ; Start of .COM code
  69. main proc far
  70.     jmp start
  71.  
  72. ; Table of number words.  Entries are number, word length, word.
  73. NumTab    label byte
  74. N0    db 0,  N1-N0-2,     'oh-oh'
  75. N1    db 1,  N2-N1-2,     'w-uh-n'
  76. N2    db 2,  N3-N2-2,     't-oo-oo'
  77. N3    db 3,  N4-N3-2,     'th-r-ee'
  78. N4    db 4,  N5-N4-2,     'f-oh-r'
  79. N5    db 5,  N6-N5-2,     'f-i-v'
  80. N6    db 6,  N7-N6-2,     's-ih-k-s'
  81. N7    db 7,  N8-N7-2,     's-eh-v-eh-n'
  82. N8    db 8,  N9-N8-2,     'a-a-t'
  83. N9    db 9,  N10-N9-2,    'n-i-n'
  84. N10    db 10, N11-N10-2,   't-eh-n'
  85. N11    db 11, N12-N11-2,   'eh-l-eh-v-uh-n'
  86. N12    db 12, N13-N12-2,   't-w-eh-l-v'
  87. N13    db 13, N14-N13-2,   'th-ih-r-t-ee-n'
  88. N14    db 14, N15-N14-2,   'f-oh-r-t-ee-n'
  89. N15    db 15, N16-N15-2,   'f-ih-f-t-ee-n'
  90. N16    db 16, N17-N16-2,   's-ih-k-s-t-ee-n'
  91. N17    db 17, N18-N17-2,   's-eh-v-eh-n-t-ee-n'
  92. N18    db 18, N19-N18-2,   'a-a-t-ee-n'
  93. N19    db 19, N20-N19-2,   'n-i-n-t-ee-n'
  94. N20    db 20, N30-N20-2,   't-w-eh-n-t-ee'
  95. N30    db 30, N40-N30-2,   'th-ih-r-t-ee'
  96. N40    db 40, N50-N40-2,   'f-oh-r-t-ee'
  97. N50    db 50, N99-N50-2,   'f-ih-f-t-ee'
  98. N99    db 99                ; EOT mark
  99.  
  100. SpeechParms    db 'th-uh t-i-m ih-z'
  101. SP2        db 255 dup (?)
  102.  
  103. StringLen    db SP2-SpeechParms
  104.     dw SpeechParms
  105.  
  106. ErrMsg$     db 'saytime internal error',13,10,10,'$'
  107.  
  108.  
  109. Start:
  110.     call Init            ; Find SPEECH
  111. ;    If carry Then            ; SPEECH not installed
  112.     JNC    SAAA_AA
  113.     mov    al,1            ; Return errorlevel 1
  114. ;    Else                ; SPEECH installed
  115.     JMP    SHORT    SAAA_AB
  116. SAAA_AA:
  117.     call Build            ; Build the time string
  118.     call Speak            ; Say the time
  119.     mov    al,0            ; Return errorlevel 0
  120. ;    Endif
  121. SAAA_AB:
  122.     @doscall 4CH            ; Back to DOS, AL=errorlevel
  123. main endp
  124.  
  125. ; -----------------------------------------------
  126. ; Build the time string and set length for SPEECH
  127. ; -----------------------------------------------
  128. Build proc near
  129.     @doscall 2CH            ; Get time (CH=hr, CL=min, DH=sec)
  130.     mov    di,offset    SP2
  131.  
  132.     mov    ah,ch            ; Add hour
  133.     call AddTime
  134.     mov    al,' '            ; Add extra pause between
  135.     stosb
  136.     inc    StringLen
  137.  
  138.     mov    ah,cl            ; Add minute
  139.     call AddTime
  140.     mov    al,' '            ; Add extra pause between
  141.     stosb
  142.     inc    StringLen
  143.  
  144.     mov    ah,dh            ; Add second
  145.     call AddTime
  146.     ret
  147.  
  148. ; ----- Add time component in AH to string
  149. AddTime:
  150.     push ax
  151.     push bx
  152.  
  153. ;    If ah < 10 Then         ; Prefix with "oh"
  154.     CMP    ah,10
  155.     JAE    SAAB_AA
  156.     mov    al,0
  157.     call AddWord
  158. ;    Endif
  159. SAAB_AA:
  160.  
  161. ;    If ah <= 20 Then
  162.     CMP    ah,20
  163.     JA    SAAC_AA
  164.     mov    al,ah
  165.     call AddWord
  166. ;    Else
  167.     JMP    SHORT    SAAC_AB
  168. SAAC_AA:
  169.     mov    bl,10
  170.     mov    al,ah
  171.     cbw
  172.     div bl            ; AH = low digit; AL = high digit
  173.     mov    bh,ah            ; BH = low digit
  174.     mul bl            ; AL = 10*high digit = tens word
  175.     call AddWord        ; Add tens
  176. ;        If bh <> 0 Then
  177.     OR    bh,bh
  178.     JE    SAAD_AA
  179.     mov    al,bh            ; Add ones
  180.     call AddWord
  181. ;        Endif
  182. SAAD_AA:
  183. ;    Endif
  184. SAAC_AB:
  185.  
  186.     pop bx
  187.     pop ax
  188.     ret
  189.  
  190. ; ----- Add word for number in AL to string
  191. AddWord:
  192.     push ax
  193.     push cx
  194.     push dx
  195.  
  196.     mov    ah,al            ; Move number to AH
  197.     mov    ch,0
  198.     mov    si,offset    NumTab
  199.  
  200. ;    Repeat
  201. SAAE_@R:
  202.     lodsb            ; Get the number from the table
  203.     mov    cl,[si]            ; CX = length
  204.     inc    si            ; SI => word for this number
  205.  
  206. ;        If ah = al Then        ; Found the right entry
  207.     CMP    ah,al
  208.     JNE    SAAF_AA
  209.     add    StringLen,cl        ; Add length of word to total
  210.     inc    StringLen        ; + 1 for space
  211.     mov    al,' '            ; Insert a space
  212.     stosb
  213.     rep movsb        ; Add word to string
  214. ;        Leave            ; Exit loop
  215.     JMP    SHORT    SAAE_@L
  216. ;        ElseIf al <> 99 Then    ; Not right entry, but not end of table
  217.     JMP    SHORT    SAAF_@Z
  218. SAAF_AA:
  219.     CMP    al,99
  220.     JE    SAAG_AA
  221.     add si,cx        ; Skip number word
  222. ;        Else            ; End of table--internal error
  223.     JMP    SHORT    SAAF_@Z
  224. SAAG_AA:
  225.     mov    dx,offset    ErrMsg$
  226.     @doscall 9
  227. ;        Endif
  228. SAAF_@Z:
  229. ;    Until Leave
  230.     JMP    SHORT    SAAE_@R
  231. SAAE_@L:
  232.     pop dx
  233.     pop cx
  234.     pop ax
  235.     ret
  236. Build endp
  237.  
  238.  
  239. ; ---------------------------------
  240. ; Call SPEECH to say the time string
  241. ; ---------------------------------
  242. Speak proc near
  243.     mov ax,offset StringLen     ; AX = ptr to parm len
  244.     push ax             ; Put on stack
  245.     call Speech            ; Call Speech program
  246.     ret
  247. Speak endp
  248.  
  249.  
  250. ; -----------------------------------------
  251. ; Make sure SPEECH is installed.  If not,
  252. ; return CF=1 and message displayed.
  253. ; -----------------------------------------
  254. Dumb$    db 'SPEECH not installed',13,10,10,'$'
  255. Init proc near
  256.     push ds
  257.     push es
  258.  
  259.     mov ax,Abs0            ; Get Speech seg addr to DS
  260.     mov es,ax
  261.     assume es:Abs0
  262.     mov ax,word ptr SpPtr
  263.     mov ds,ax
  264.     assume ds:SpeechSeg
  265.  
  266.     cmp SpeechCode,090H        ; Verify 1st three bytes of Speech code
  267.     jne Dumb
  268.     cmp SpeechCode+1,1EH
  269.     jne Dumb
  270.     cmp SpeechCode+2,0B8H
  271.     jnz Dumb
  272.  
  273.     pop es
  274.     pop ds
  275.     clc
  276. Init9:
  277.     ret
  278.  
  279.  
  280. Dumb:
  281.     pop es
  282.     pop ds
  283.     mov    dx,offset    Dumb$
  284.     @doscall 9
  285.     stc
  286.     jmp Init9
  287. Init endp
  288. code ends
  289. end main
  290.